package ProyectoEstacionamiento;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

class Estacionamiento {
	private int capacidad;       //tamaño máximo de autos
	private List<Auto> listaEst; //Lista que almacen los autos
        private List<Formados> lformados;
        //CONSTURCTOR
	public Estacionamiento(int max,List<Formados> lformados) {
		capacidad  = max;
		listaEst = new ArrayList();
                this.lformados=lformados;
               /// formados = new ArrayList();
	}

        //METODOS PARA ENTRAR Y SALIR DEL ESTACIONAMIENTO
	public synchronized void AsignaCajon(String nombre,Auto vocho){

                while (listaEst.size()==capacidad){
                    try {
                        //if(formados.isEmpty())System.out.println(nombre+": No hay nadie formado me dormiré" );else
                        //if(listaEst.size()==capacidad)System.out.println(nombre+": Estacionamiento lleno me dormiré" );
			wait();
                        //wait();                                 //se pone a dormir y cede el monitor
		   } catch (InterruptedException e) {}
                }
		listaEst.add(vocho);                            //agrega un auto al estacionamiento
                System.out.println(nombre+": Ingresé al auto "+vocho.getMatricula()+". Quedan "+(capacidad-listaEst.size())+" lugares");
                                                    //despierta a todos los hilos
                //impresion
                System.out.printf("\t\t\t\tEstacionados: ");
                    for (int h=0;h<listaEst.size();h++){
                        System.out.printf("[%s]",listaEst.get(h).getMatricula());
                    }
                    System.out.println("");
                notifyAll();
 /*             
                int limite=0;
                for (int a=0;a<lformados.size();a++){   //sacamos el tamaño maxiomo de la tabla
                    if(lformados.get(a).getFormados().size()>limite)
                        limite=lformados.get(a).getFormados().size();
                    else limite=listaEst.size();
                }                
              String afuera="",adentro="";
                for (int j=0;j<lformados.size();j++){
                        System.out.printf("\tEntada %d",j);
                    }
                System.out.printf("\tEstacionados\n");
               
                for(int i=0;i<limite;i++){  //para imprimir renglon por renglon
                    
                    for (int j=0;j<lformados.size();j++){
                    if (lformados.get(j).getFormados().size()<=i)afuera="       ";else afuera=lformados.get(j).getFormados().get(i).getMatricula();    
                    System.out.printf("\t %s",afuera);
                    }
                    if (listaEst.size()<=i)adentro="       ";else adentro=listaEst.get(i).getMatricula();                    
                    System.out.printf("\t %s\n",adentro);
                }  */  
	}

        
        public synchronized void LiberaCajon(String nombre){
            
		while (listaEst.isEmpty()) {                   //mientras el estacionamiento este vacio
		  try {
                        
			//System.out.println(nombre+": No hay autos en el estacionamiento, me dormiré" );
                        wait();                                //se pone a dormir y cede el monitor
		   } catch (InterruptedException e) {}
		}
                Random rm = new Random();
		Auto vocho=listaEst.remove(rm.nextInt(listaEst.size()));//remueve primer elemento
                System.out.println(nombre+": salió el auto "+vocho.getMatricula()+". Quedan "+(capacidad-listaEst.size())+" lugares");
		notifyAll();                                   //despierta a todos los hilos
		
	}
   

    
        
        //GETTER & SETTER   

    public int getCapacidad() {
        return capacidad;
    }

    public void setCapacidad(int capacidad) {
        this.capacidad = capacidad;
    }

    public List<Auto> getListaEst() {
        return listaEst;
    }

    public void setListaEst(List<Auto> listaEst) {
        this.listaEst = listaEst;
    }

    public List<Formados> getLformados() {
        return lformados;
    }

    public void setLformados(List<Formados> lformados) {
        this.lformados = lformados;
    }


    
}